﻿// Copyright (c) 2012 - 2020 Jared Zheng <jaredz at outlook dot com>
// Buddha Framework is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
//          http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
//
// Create : 2012-12-01 version 0.1 Jared Zheng <jaredz at outlook dot com>
// Update : 2018-12-05 version 3.1.5 Jared Zheng <jaredz at outlook dot com>

#ifndef __DATA_DEF_H__
#define __DATA_DEF_H__

#pragma once

#include "networkevent.h"

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// server uuid : 各服务器的UUID定义
DECLARE_UUID( ICenterServer,   {A4B5C135-D28D-4FCA-859D-26A79F04414F} ) // 同步管理服务器
DECLARE_UUID( IBalanceServer,  {1A220E2B-87A3-4463-BD44-9EC7416A6561} ) // 授权均衡服务器
DECLARE_UUID( IAuthorDBServer, {C94ED6D5-95EB-41E5-A7B3-18FA23BF8532} ) // 授权数据服务器
DECLARE_UUID( IAuthorServer,   {B3F4F6E1-CD96-494E-B78D-91935EDB304F} ) // 授权网关服务器
DECLARE_UUID( IMasterDBServer, {8615C159-72F1-4FD4-A73A-CBF3A8A367C2} ) // 业务数据服务器
DECLARE_UUID( IMasterServer,   {02E87886-B5DF-479A-8289-AE6BEF40B398} ) // 业务管理服务器
DECLARE_UUID( IServiceServer,  {ABEBFEDC-DA2A-4EFE-97EA-049B5AFDF09E} ) // 业务功能服务器
DECLARE_UUID( IGateServer,     {1395246A-FEE6-4613-B8D9-6FCB7859E751} ) // 业务网关服务器

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// check uuid : 检测UUID定义
DECLARE_UUID( KeepAlive,       {9C15ED27-04F1-4EA7-917B-FA8B72A69C7F} ) // 控制台模式监听守护进程的信号, 如果无信号停止退出
DECLARE_UUID( MayDay,          {00568FE7-F3C1-45F3-9CFD-FEE6E0CE2080} ) // 守护进程定时遍历所有服务器进程信号PID_MAYDAY_{GUID}, 有对应信号的结束进程再重启相应的服务器
DECLARE_UUID( WarnLoad,        {A85450F9-6E26-4D2C-92DD-97882672E176} ) // 守护进程定时遍历所有服务器进程信号PID_WARNLOAD_{GUID}, 有对应信号的超过预计时间则结束进程再重启相应的服务器
DECLARE_UUID( OverLoad,        {10FA9CF3-C1A5-42D2-85BF-4A5DB1E827CC} ) // 守护进程定时检测广域网ping值, 多次超时无响应设置ping值异常状态
DECLARE_UUID( BusyLoad,        {73EF0598-718B-4B82-9AD7-B446BA74786C} ) // 守护进程定时检测广域网ping值, 多次延时响应>100ms设置ping值延迟状态

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 通用常量定义
enum DATA_DEF
{
    // 检测网络工作线程, 异步事件队列和定时器线程的超时倍数
#ifdef __RUNTIME_DEBUG__
    DATAD_TIME         = 100,
#else
    DATAD_TIME         = 2,
#endif
    DATAD_UPDATE       = 10,

    DATAD_SORT         = 1024,   // 排序结果保存默认数量

    DATAD_TOPERCENT    = 400,    // 万分比转换成百分比
    DATAD_INCR_LOAD    = 400,    // 负载默认增量(万分比)
    DATAD_BUSY_LOAD    = 32000,  // 服务器繁忙(万分比)
    DATAD_FULL_LOAD    = 40000,  // 服务器满载(万分比)
    DATAD_OVER_LOAD    = 48000,  // 服务器最大超载(万分比)
    DATAD_WARN_LOAD    = 56000,  // 服务器告警
    DATAD_MAY_DAY      = 64000,  // 服务器异常

    DATAD_UPDATEID     = 0xFF00, // Id >= 65280(0XFF00)保留给更新业务管理服务器使用
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 错误定义
enum ERROR_DEF
{
    ERRORD_OKAY,                 // 成功
    ERRORD_FAIL,                 // 通用错误
    ERRORD_MAYDAY,               // 服务器功能异常
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务器类型
enum PAK_TYPE
{
    PAKT_NONE,
    PAKT_CENTER = PAKT_NONE,   // 同步管理服务器
    PAKT_BALANCE,              // 授权均衡服务器
    PAKT_AUTHORDB,             // 授权数据服务器
    PAKT_AUTHOR,               // 授权网关服务器
    PAKT_MASTERDB,             // 业务数据服务器
    PAKT_MASTER,               // 业务管理服务器
    PAKT_SERVICE,              // 业务功能服务器
    PAKT_GATE,                 // 业务网关服务器
    PAKT_MAX,

    PAKT_AUTHOR_CENTER,        // (防止同步管理和授权数据同进程都使用同标识, 广播时对同个服务器出现2次一样的广播)
    PAKT_AUTHOR_AUTHORDB,
    PAKT_MASTER_CENTER,        // (防止同步管理和业务数据同进程都使用同标识, 广播时对同个服务器出现2次一样的广播)
    PAKT_MASTER_MASTERDB,
    PAKT_MASTER_UPDATE,        // 更新业务管理服务器
    PAKT_SERVICE_MASTERDB,     // (防止业务数据和业务管理同进程都使用同标识, 广播时对同个服务器出现2次一样的广播)
    PAKT_SERVICE_MASTER,

    PAKT_EXTERNAL_READY  = 0x20,
    PAKT_EXTERNAL_AUTHOR = 0x40,
    PAKT_EXTERNAL_MASTER = 0x80,
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 异步事件队列类型
enum QUEUE_TYPE
{
    QUEUE_TYPE_NONE                = CEventQueue::EVENT_TYPE_NONE,
    QUEUE_TYPE_REFCOUNT            = CEventQueue::EVENT_TYPE_REFCOUNT,
    QUEUE_TYPE_CACHE_REF           = CEventQueue::EVENT_TYPE_CACHE_REF,
    QUEUE_TYPE_CACHE_MANAGED       = CEventQueue::EVENT_TYPE_CACHE_MANAGED,
    QUEUE_TYPE_CACHE_QUEUE         = CEventQueue::EVENT_TYPE_CACHE_QUEUE,

    QUEUE_TYPE_MASK                = 0x0000000F,
    QUEUE_TYPE_TCP                 = 0x00000010,
    QUEUE_TYPE_UDP                 = 0x00000020,

    QUEUE_TYPE_NONE_TCP            = (QUEUE_TYPE_NONE|QUEUE_TYPE_TCP),
    QUEUE_TYPE_REFCOUNT_TCP        = (QUEUE_TYPE_REFCOUNT|QUEUE_TYPE_TCP),
    QUEUE_TYPE_CACHE_REF_TCP       = (QUEUE_TYPE_CACHE_REF|QUEUE_TYPE_TCP),
    QUEUE_TYPE_CACHE_MANAGED_TCP   = (QUEUE_TYPE_CACHE_MANAGED|QUEUE_TYPE_TCP),
    QUEUE_TYPE_CACHE_QUEUE_TCP     = (QUEUE_TYPE_CACHE_QUEUE|QUEUE_TYPE_TCP),

    QUEUE_TYPE_NONE_UDP            = (QUEUE_TYPE_NONE|QUEUE_TYPE_UDP),
    QUEUE_TYPE_REFCOUNT_UDP        = (QUEUE_TYPE_REFCOUNT|QUEUE_TYPE_UDP),
    QUEUE_TYPE_CACHE_REF_UDP       = (QUEUE_TYPE_CACHE_REF|QUEUE_TYPE_UDP),
    QUEUE_TYPE_CACHE_MANAGED_UDP   = (QUEUE_TYPE_CACHE_MANAGED|QUEUE_TYPE_UDP),
    QUEUE_TYPE_CACHE_QUEUE_UDP     = (QUEUE_TYPE_CACHE_QUEUE|QUEUE_TYPE_UDP),
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务器运行状态
enum STATUS_SERVER
{
    STATUSS_NONE       = 0, // 无状态
    STATUSS_INIT,           // 初始状态
    STATUSS_RUN,            // 运行状态
    STATUSS_PAUSE,          // 暂停状态
    STATUSS_BUSY,           // 繁忙状态
    STATUSS_FULL,           // 满载状态
    STATUSS_OVER,           // 超载状态
    STATUSS_ERROR,          // 异常状态
    STATUSS_STOP,           // 停止状态
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务器连接状态
enum STATUS_LINK
{
    STATUSL_NONE       = 0,
    STATUSL_CNNTING    = 4,  // 连接状态每次更新都自减1, 到0重新开始连接
    STATUSL_CNNTED     = 8,
    STATUSL_LINKING    = 12, // 注册状态每次更新都自减1, 到8重新开始注册
    STATUSL_LINKED     = 16,
    STATUSL_RESERVED   = 20,
    STATUSL_FAILED     = 24,
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务器数据更新状态
enum STATUS_UPDATE
{
    STATUSU_NONE       = 0x0000, // 初始状态
    STATUSU_LINK       = 0x0001, // 注册数据状态
    STATUSU_OKAY       = 0x0002, // 数据处理完成状态
    STATUSU_SYNC       = 0x0004, // 需要同步更新状态
    STATUSU_UNLINK     = 0x0008, // 注销状态
    //                                
    STATUSU_UPDATE     = 0x0010, // 接收方同步数据时直接变成完成状态
    STATUSU_NOADDR     = 0x0020, // 忽略地址信息
    STATUSU_DUMP       = 0x0040, // 打印调试信息

    STATUSU_XLINKSYNC  = (STATUSU_LINK|STATUSU_SYNC|STATUSU_UNLINK), // 状态组合1
    STATUSU_OKAYSYNC   = (STATUSU_OKAY|STATUSU_SYNC),                // 状态组合2
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 各服务器信令定义范围
enum PAK_EVENT
{
    // !!!注意请求信令+(PAKE_XXX_ACK - PAKE_XXX_BEGIN) == 对应回复信令!!!
    // !!!如果不安上诉规则, 在服务器内部异常构造回复包时无法转换到正确的回复信令

    // 内部预留信令, 用于各服务器之间的通用通信, 无会话要求
    // 如需要服务器之间特定的信令, 在各服务器独自预留信令内定义
    // 通用信令范围
    PAKE_COMMON_BEGIN  = 1000, //(CNETTraits::EVENT_RESERVED + 900),
    PAKE_COMMON_END    = (PAKE_COMMON_BEGIN + 1999),
    // 均衡信令范围
    PAKE_BALANCE_BEGIN,
    PAKE_BALANCE_ACK   = (PAKE_BALANCE_BEGIN + 1000),
    PAKE_BALANCE_END   = (PAKE_BALANCE_BEGIN + 1999),
    // 授权信令范围
    PAKE_AUTHOR_BEGIN,
    PAKE_AUTHOR_ACK    = (PAKE_AUTHOR_BEGIN + 1000),
    PAKE_AUTHOR_END    = (PAKE_AUTHOR_BEGIN + 1999),
    // 业务信令范围
    PAKE_SERVICE_BEGIN,
    PAKE_SERVICE_ACK   = (PAKE_SERVICE_BEGIN + 1000),
    PAKE_SERVICE_END   = (PAKE_SERVICE_BEGIN + 1999),
    // 例程信令范围
    PAKE_ROUTINE_BEGIN      = 9999,

    PAKE_ROUTINE_COMMUNE    = PAKE_ROUTINE_BEGIN,
    // !!!不要在业务连接/断开时候带数据, 服务器内部对这2个有额外数据需要写入
    // !!!需要发送数据的用自定义信令
    PAKE_ROUTINE_LINK,
    PAKE_ROUTINE_UNLINK,

    PAKE_ROUTINE_LIVE       = (PAKE_ROUTINE_BEGIN + 25000),

    PAKE_ROUTINE_LINKACK,
    PAKE_ROUTINE_UNLINKACK, 

    PAKE_ROUTINE_END        = (PAKE_ROUTINE_BEGIN + 50000),
    PAKE_ROUTINE_LIVEACK    = PAKE_ROUTINE_END,

    PAKE_ROUTINE_FAIL,
};

enum MAP_HASH
{
    MAP_HASH_MIN = 4 * 8 * 1024,
    MAP_HASH_MAX = 16 * 8 * 1024,
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 框架使用的数据包头部类型
typedef UShort                       UEVENT;
typedef UShort                       UTYPE;
typedef UShort                       UACK;
typedef UShort                       USRVID;

typedef CNETTraits::Socket           Socket_t;
typedef CNETTraits::STR_ADDR         CStrAddr;
typedef CNETTraits::NET_ADDR         CNetAddr;
typedef CNETTraits::CStreamScopePtr  CNetStreamPtr;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 服务器信息结构定义 : 信息统计使用
// !!! Id >= 65280(0XFF00)保留给更新业务管理服务器使用

struct tagSERVER_STATUS : public MObject
{
public:
    tagSERVER_STATUS(void)
    : uTotal(0)
    , uOnline(0)
    , usLoad(0)
    , usIncr(0)
    , usId(0)
    , usStatus(0)
    {
    }

    ~tagSERVER_STATUS(void)
    {
    }
public:
    UInt     uTotal;     ///< 连接数量
    UInt     uOnline;    ///< 有效数量
    UShort   usLoad;     ///< [0 - DATAD_FULL_LOAD]服务器负载情况(万分比)
    UShort   usIncr;     ///< 每增加一个增长的负载(万分比)
    UShort   usId;       ///< 服务器Id, 可以用来索引名称或者区分服务器类型, 也可以用来物理地址划分
    UShort   usStatus;   ///< 服务器状态STATUS_UPDATE
};
typedef struct tagSERVER_STATUS   SERVER_STATUS, *PSERVER_STATUS;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 服务器信息排序结构定义
struct tagSERVER_SORT : public MObject
{
public:
    tagSERVER_SORT(void)
    : ullKey(0)
    , usLoad(0)
    , usIncr(0)
    {
    }

    ~tagSERVER_SORT(void)
    {
    }
public:
    ULLong     ullKey;   ///< session key
    UShort     usLoad;   ///< 服务器负载情况(万分比)
    UShort     usIncr;   ///< 服务器负载情况增加数值(万分比)
    UShort     usId;     ///< 服务器Id
    UShort     usStatus; ///< 保留
    CNetAddr   Addr;     ///< 地址信息
};
typedef struct tagSERVER_SORT   SERVER_SORT, *PSERVER_SORT;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 框架使用的服务器注销/断开通知数据定义
typedef union tagSERVER_UNLINK
{
public:
    tagSERVER_UNLINK(void)
    : utData(0)
    {
    }

    ~tagSERVER_UNLINK(void)
    {
    }
public:
    typedef struct tagTYPE_ID
    {
        UShort usType;
        UShort usId;
    }TYPE_ID, *PTYPE_ID;
    TYPE_ID   tiData;
    uintptr_t utData;
}SERVER_UNLINK, *PSERVER_UNLINK;

#endif // __DATA_DEF_H__
